﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

//extern int Add(int x, int y);
//
//int main()
//{
//	int a = 10;
//	int b = 10;
//	int ret = Add(a, b);
//	printf("%d\n", ret);
//	return 0; 
//}

//int main()
//{
//	int y = 0;
//	int m = 0;
//	while (scanf("%d %d", &y, &m) == 2);
//	{
//		switch (m)
//		{
//			case 1:
//			case 3:
//			case 5:
//			case 7:
//			case 8:
//			case 10:
//			case 12:
//				printf("%d\n", 31);
//				break;
//			case 4:
//			case 6:
//			case 9:
//			case 11:
//				printf("%d\n", 30);
//				break;
//			case 2:
//			{
//				if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0)
//				{
//					printf("%d\n", 29);
//				}
//				else
//				{
//					printf("%d\n", 28);
//				}
//			}
//		}
//	}
//	return 0;
//}


//int is_leap_year(int y)
//{
//	return (y % 4 == 0 && y % 100 != 0 || y % 400 == 0);
//}
//
//int main()
//{
//	int y = 0;
//	int m = 0;
//	int days[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
//
//	while (scanf("%d %d", &y, &m) == 2) 
//	{
//		int day = days[m];
//		if (is_leap_year(y) && m == 2) 
//		{
//			day++;
//		}
//		printf("%d\n", day);
//	}
//	return 0;
//}

//int main()
//{
//	int ch = 0;
//	while ((ch = getchar()) != EOF)//本质上是-1，所以这里使用int型最为合适
//	{
//		if ((ch >= 'a') && (ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
//		{
//			printf("%c is an alphabet.\n", ch);
//		}
//		else
//		{
//			printf("%c is not an alphabet.\n", ch);
//		}
//		getchar();//清除缓冲区多余的\n
//	}
//	return 0;
//}
//#include<ctype.h>
//
//int main()
//{
//	int ch = 0;
//	while ((ch = getchar()) != EOF)
//	{
//		if (isupper(ch))
//		{
//			printf("%c\n", tolower(ch));
//		}
//		if (islower(ch))
//		{
//			printf("%c\n", toupper(ch));
//		}
//		getchar();
//	}
//	return 0;
//}

//int main()
//{
//	float price = 0;
//	int m = 0;
//	int d = 0;
//	int flag = 0;
//	scanf("%lf %d %d %d", &price);
//		if (m == 11 && d == 11)
//		{
//			price = price * 0.7 - flag * 50;
//		}
//		else if (m == 12 && d == 12)
//		{
//			price = price * 0.8 - flag * 50;
//		}
//		if (price < 0.0)
//		{
//
//		}
//		printf("%.2lf\n", price);
//
//	return 0;
//
//}


//#include <stdio.h>
//int main()
//{
//    int arr[] = { 1,2,3,4,5 };
//    short* p = (short*)arr;
//    int i = 0;
//    for (i = 0; i < 4; i++)
//    {
//        *(p + i) = 0;
//    }
//
//    for (i = 0; i < 5; i++)
//    {
//        printf("%d ", arr[i]);
//    }
//    return 0;
//}

//#include <stdio.h>
//int main()
//{
//    //小端存储，倒着存
//    int a = 0x11223344;//一个整形是四个字节
//    char* pc = (char*)&a;
//    *pc = 0;
//    printf("%x\n", a);
//    return 0;
//}


//思想就是找到第一个和最后一个，把他们实现交换
//int main()
//{
//	char arr[10001] = {0};
//	//scanf("%s", arr);
//	//scanf("%[^\n]", arr);//这种形式也可以
//	gets(arr);
//	int len = strlen(arr);
//	int left = 0;
//	int right = len - 1;
//	
//	while (left < right)
//	{
//		int tmp = arr[left];
//		arr[left] = arr[right];
//		arr[right] = tmp;
//		left++;
//		right--;
//	}
//
//	printf("%s\n", arr);
//	return 0;
//}

//int main()
//{
//	//上
//	int line = 0;
//	scanf("%d", &line);
//	int i = 0;
//	for (i = 0; i < line; i++)
//	{
//		//打印一行
//		//空格打印
//		int j = 0;
//		for (j = 0; j < line - 1 - i; j++)
//		{
//			printf(" ");
//		}
//		//*的打印
//		for (j = 0; j < 2 * i + 1; j++)
//		{
//			printf("*");
//		}
//		printf("\n");
//	}
//	//下
//	for (i = 0; i < line - 1; i++)
//	{
//		//空格打印
//		int j = 0;
//		{
//		for (j = 0; j <= i; j++)
//			printf(" ");
//		}
//		//*的打印
//		for (j = 0; j < 2 * (line - 1 - i) - 1; j++)
//		{
//			printf("*");
//		}
//		printf("\n");
//	}
//	return 0;
//}
//#include<math.h>
//int main()
//{
//	int i = 0;
//	//判断为几位数
//	for (i = 0; i <= 100000; i++)
//	{
//		//判断i是否为自幂数
//		//1.计算i的位数n
//		int n = 1;
//		int tmp = i;
//		while (tmp /= 10)
//		{
//			n++;
//		}
//		//2.得到i的每一位的n次方求和
//		tmp = i;
//		int sum = 0;
//		while (tmp)
//		{
//			sum += (int)pow(tmp % 10, n);
//			tmp /= 10;
//		}
//		if (sum == i)
//		{
//			printf("%d ", i);
//		}
//	}
//	return 0;
//}

//int main()
//{
//	int a = 0;
//	int n = 0;
//	scanf("%d %d", &a, &n);
//	int i = 0;
//	int sum = 0;
//	int k = 0;
//
//	for (i = 0; i < n; i++)
//	{
//		k = k * 10 + a;
//		sum += k;
//	}
//	printf("%d\n", sum);
//	return 0;
//}

//struct stu
//{
//    int num;
//    char name[10];
//    int age;
//};
//
//
//void fun(struct stu* p)
//{
//    printf(" % s\n", (*p).name);
//    return;
//}
//
//
//int main()
//{
//    struct stu students[3] = { {9801,"zhang",20},
//                              {9802,"wang",19},
//                              {9803,"zhao",18}
//    };
//    fun(students + 1);
//    return 0;
//}

//#include<stdio.h>
//int main()﻿
//{
//	int money = 20;
//	int price = 1;
//	int i = 0;
//	printf("%d", money);
//	return 0;
//}

//#include<stdio.h>
//int main()
//{
//    int i, j;
//    for (i = 10000; i < 99999; i++)
//    {
//        int sum = 0;
//        for (j = 10; j <= 10000; j = 10 * j)
//        {
//            sum += (i / j) * (i % j);
//        }
//        if (sum == i)
//            printf("%d ", i);
//    }
//    return 0;
//}

//int main()
//{
//	int money = 20;
//	int total = money;
//	int empty = money;
//	while (empty >= 2)
//	{
//		total += empty / 2;
//		empty = empty / 2 + empty % 2;
//	}
//	printf("%d\n", total);
//
//	return 0;
//}


//void print(int A, int B)
//{
//	int a = A;
//	int b = B;
//	int C = 0;
//	while (B != 0)
//	{
//		C = A % B;
//		A = B;
//		B = C;
//	}
//	printf("%d\n", a * b / A);
//}
//
//int main()
//{
//	int A = 0;
//	int B = 0;
//	scanf("%d %d", &A, &B);
//	print(A, B);
//	return 0;
//}


//void print(char* pa, int ret)
//{
//	int left = 0;
//	int right = ret - 1;
//	int i = 0;
//	while (left < right)
//	{
//		int tmp = pa[left];
//		pa[left] = pa[right];
//		pa[right] = tmp;
//		left++;
//		right--;
//	}
//	printf("%s\n", pa);
//}
//
//int main()
//{
//	char arr[101] = {0};
//	gets(arr);
//	int ret = sizeof(arr) / sizeof(arr[0]);
//	print(arr, ret);
//	return 0;
//}

//int main()
//{
//	char arr[10001] = { 0 };
//	//scanf("%s", arr);
//	//scanf("%[^\n]", arr);//这种形式也可以
//	gets(arr);
//	int len = strlen(arr);
//	int left = 0;
//	int right = len - 1;
//
//	while (left < right)
//	{
//		if (arr[left] == '.' || arr[right] == '.')
//		{
//			break;
//		}
//		int tmp = arr[left];
//		arr[left] = arr[right];
//		arr[right] = tmp;
//		left++;
//		right--;
//	}
//
//
//	printf("%s\n", arr);
//	return 0;
//}


#include<stdio.h>

//void reverse(char* str, int start, int end)
//{
//	end--;
//	while (end > start)
//	{
//		char tmp = str[start];
//		str[start] = str[end];
//		str[end] = tmp;
//		end--;
//		start++;
//	}
//}
//
//void reverseword(char* str)
//{
//	int start = 0;
//	int end = 0;
//	while (str[start] != '\0')
//	{
//		while (str[end] != '\0' && str[end] != ' ')
//		{
//			end++;
//		}
//		reverse(str, start, end);
//		if (str[end] != '\0')
//		{
//			start = end + 1;
//		}
//		else
//		{
//			start = end;
//		}
//		end++;
//
//	}
//}
//
//int main()
//{
//	char str[100] = { 0 };
//	gets(str);
//	int n = strlen(str);
//
//	//整体翻转
//	reverse(str, 0, n);
//	//单词翻转
//	reverseword(str);
//
//	printf("%s", str);
//	return 0;
//}
//

//C语言规定了语法，也规定了库函数，规定了功能,参数，函数名以及返回类型.
//库函数是由编译器提供的
#include<stdio.h>
#include<string.h>
#include<assert.h>
void reserve(char* left, char* right)
{
	assert(left);
	assert(right);

	while (left < right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}

int main()
{
	char arr[101] = { 0 };
	gets(arr);
	char* pa = arr;
	while (*pa)
	{
		char* left = pa;
		char* right = pa;
		while (*right != ' '&& *right != '\0')
		{
			right++;
		}
		reserve(left, right - 1);
		if (*right != '\0')
		{
			pa = right + 1;
		}
		else
		{
			pa = right;
		}
	}
	//逆序整个字符串
	int len = strlen(arr);
	reserve(arr, arr + len - 1);

	printf("%s\n", arr);

	return 0;
}